import logging
import os
import pprint
import time
import unittest
from concurrent.futures import ThreadPoolExecutor, as_completed

from dotenv import load_dotenv

from src.FilesAgent import get_file_if_cached_otherwise_parse, get_extent_by_, get_context_from_file
from src.chatAI import ZhiPuAI, MyHistoryLoader
from src.custom.messages import build_system_message, build_human_message, build_ai_message
from src.custom.tools import ToolDeclarationConfig, read_json, match_json_str
from src.file_parsers.FileManage import get_file_cache_dict_by_, write_file_cache
from src.file_parsers.PDFParsers import pdf_parser
from src.user import UserInfo

tool = ToolDeclarationConfig("unit_test")
@tool(file_id="要读取文件的id值")
def get_file_view(file_id: str) -> str:
    """通过文件的id值来获取文件的内容信息"""
    file_dict = get_file_cache_dict_by_(file_id)
    file_info = """
    <source_file_id>
    {source_file_id}
    </source_file_id>
    <content>
    {content}
    </content>
    """
    if file_dict is None:
        return "没有该文件的信息"
    file_text_json = read_json(file_dict['file_text_path'])
    text = ""
    for i, chunk in enumerate(file_text_json):
        text += str(i) + ". " + chunk['text'] + "\n"
    file_info = file_info.format(content=text, source_file_id=file_id)
    return file_info


class MyTestCase(unittest.TestCase):
    def test_calculate_month(self):
        from datetime import datetime

        # 假设这是之前保存的时间
        saved_date_str = "2023-01-01"

        # 将保存的时间字符串转换为datetime对象
        saved_date = datetime.strptime(saved_date_str, "%Y-%m-%d")
        print(f"saved_date_str: {saved_date}")
        # 获取当前时间
        current_date = datetime.now()
        print(f"curr time: {current_date}")
        # 格式化输出
        formatted_now = current_date.strftime("%Y-%m-%d")
        print("格式化后的当前时间：", formatted_now)

        # 计算两个时间点之间的差异
        delta = current_date - saved_date

        # 获取天数
        days_difference = delta.days
        print("相差的天数：", days_difference)

    def test_ai_send_message(self):
        env_var = os.getenv('ZHIPU_API_KEY')
        print("env_var", env_var)
        zhipuai = ZhiPuAI()
        re = zhipuai.send_message("下午好")
        print(re)

    def test_pdf_file(self):
        import pdfplumber
        from concurrent.futures import ThreadPoolExecutor

        # 定义处理PDF每一页的函数
        def process_pdf_page(pdf_page):
            # 在这里实现处理PDF页面的逻辑
            text = pdf_page.extract_text()
            # 假设我们只是打印文本
            print(text)

        # 定义处理整个PDF文件的函数
        def process_pdf_file(pdf_path):
            with pdfplumber.open(pdf_path) as pdf:
                # 使用线程池来并行处理每一页
                with ThreadPoolExecutor(max_workers=5) as executor:
                    # 将每一页的PDF处理任务提交给线程池
                    for page in pdf.pages:
                        executor.submit(process_pdf_page, page)

        # 调用函数处理PDF文件
        process_pdf_file("../../static/cache/file_cache/中期报告_5ce75bc9215578115838d83d00aeca98dc3c101794f3777aa1d24bb9ebf7538f.pdf")

    def test_get_file_view(self):
        # 更改工作目录
        project_root = '../'
        os.chdir(project_root)
        load_dotenv("../.env")
        u = UserInfo("ss")
        # u.session_name = "8d0f1256-63a3-42c4-a56a-2bd3a3f6e39a"
        u.load()
        s = """
            你是一个文件助理，可以帮助用户分析文件内容和提出合理的建议，满足用户的所有需求。如下用户所拥有的文件信息：
            {files}
            ### `<content></content>`标签括起来的是上传的文件内容，请根据文件回答相关问题。
            如果文件里没有相关信息，需要先声明**未能在文件中找到**，然后根据上下文回答问题。
            ### 回答任何问题必须使用json格式，必须用<json>标签包裹。
            ### json包含的键：
            “text”：回答的文本;
            “order”：如果此回答参考了文件中的内容，需要将<content>对应的文本前的序号填入这个数组中，序号不能超过对应<content>文件中序号的最大值，也不能无中生有;
            “source_file_id”：回答内容的来源文件id，可以根据这个文件id追溯源文件;
            ### 没有参考到<content>文件里的内容则order为[]，source_file_id为""。
        
            ### 例子1：
            <source_file_id>
            111111122222222222333333333444444444
            </source_file_id>
            <content>
            0. 小红有一个弟弟叫小明
            1. 小明的二弟叫小蓝
            2. 小明有两个弟弟
            3. 小明的三弟叫小黄
            4. 小明一家有7个人
            </content>
            ### 提问：“小明有几个弟弟，分别叫什么”
            ### 回答：
            <json>
            {{
                "answers":[
                    {{"text": "根据您提供的内容可知：\n", "order": [], "source_file_id": ""}},
                    {{"text": "小明家里面有7口人，", "order": [], "source_file_id": "111111122222222222333333333444444444"}},
                    {{"text": "其中小明有两个弟弟\n", "order": [2], "source_file_id": "111111122222222222333333333444444444"}},
                    {{"text": "二弟叫小蓝，三弟叫小黄。\n", "order": [1, 3], "source_file_id": "111111122222222222333333333444444444"}}
                ]
            }}
            </json>
            ### 例子2：
            <source_file_id>
            4444444445555555555666666666
            </source_file_id>
            <content>
            0. 从正式公布到发售，《黑神话：悟空》经历了多次挑战，包括来自SBI等群体的批评。不过，游戏也获得了金摇杆大奖等奖项的认可。\n在《黑神话：悟空》经历了这些事件后，有玩家发帖表示《黑神话：悟空》可谓是“年度
            1. 爽文”，发售前有多憋屈，现在就有多爽，并列举了一些例子来佐证自己的观点。\n帖主的观点得到了很多玩家的认同，有玩家表示最终决定销量和口碑还是游戏本身的高质量，光靠这种“莫须有”的抹黑是没有用的。“
            2. 那黑猴被押在舆论场上，抹黑诽谤，围攻群殴，毫发无伤。\n\n第一章 中国历史的分期\n讲历史必须分期，但不能严格分期。\n西方人把历史分成上古、中古和近代三个时期，但中国史如此来分则不妥当。如果把秦代以前划分为上古，虽然可以，但由于中国史时间长，所以不妥当。我今把
            3. 中国历史分为五期。\n中国历史在上古以前，尚有史前期。按照一般来说，历史是有文字记载，由于近代发掘地层而新添地质学、生物学、人类学，因此又有史前史，再上去有天文学，这些都是学历史必然要有的知识。有文字记载以前的历史，叫作史前史，靠器
            4. 物（用具）\n保留于地下，借着发掘而推想古代人民的生活文化，这既是古人的历史，也是田野的历史，亦是无文字的历史。一般来说，这是第一期的石器时期。这第一期又可分成两个时期：（一）旧石器时期
            5. ，（二）新石器时期。古人懂得用石头，也不把它磨光削尖，就拿来用，此之谓旧石器；而把石头加以磨光削尖等处理后才加以运用的，便是新石器了。\n第二期便是铜器时期。此时期已有文字。\n第三期则是铁器时期。铁之发现是在铜器之后。\n第四期是电器时期。\n第五期是原子能时期。使用原子能是人类历史的新观点。
            </content>
            ### 提问：“文中提到了哪些事情，黑神话得到了什么”
            ### 回答：
            <json>
            {{
                "answers":[
                    {{"text": "文中提到了《黑神话：悟空》游戏获奖的事情，同时伴随一些批评的声音。：\n", "order": [0, 1], "source_file_id": "4444444445555555555666666666"}},
                    {{"text": "还说到了有关中国历史的划分和各个时期的特点。\n", "order": [3, 4, 5], "source_file_id": "4444444445555555555666666666"}},
                    {{"text": "黑神话悟空经历了爽文的过程，获得了很多玩家的支持，", "order": [1], "source_file_id": "4444444445555555555666666666"}},
                    {{"text": "但也有一些抹黑和批评，不过最终获得了金摇杆大奖取得了很好的成绩\n", "order": [0, 2], "source_file_id": "4444444445555555555666666666"}}
                ]
            }}
            </json>
            ### 提问：“对黑神话悟空你有什么看法？”
            ### 回答：
            <json>
            {{
                "answers":[
                    {{"text": "黑神话悟空凭借自己的实力和游戏的可玩性获得了玩家的好评，但是一些媒体和水军的无端攻击终究是掩盖不了黑神话悟空优秀的事实。\n", "order": [], "source_file_id": ""}}
                ]
            }}
            </json>
            """
        file_info = {
                "files": [
                    {"file_name": "中期报告2024.pdf", "file_id": "5ce75bc9215578115838d83d00aeca98dc3c101794f3777aa1d24bb9ebf7538f"}
                ]
            }
        my_history = MyHistoryLoader(u, s.format(files=file_info))
        my_history.load()
        my_history.start_new_session("新会话")
        zhipuai = ZhiPuAI(my_history)
        zhipuai.bind_tools([get_file_view])

        my_history.add_messages([
            build_human_message("下午好"),
            build_ai_message("你好，很高兴见到你"),
            # build_human_message("报告中提到投简历时的一些方法和考量包括")
        ])
        new_file_info = {"file_name": "关于学弟学妹投递简历的建议.pdf", "file_id": "6011d19716cbe53f38d641f9365dcd4c189ab99ab539af0484a824784cb1a3ee"}
        file_info['files'].append(new_file_info)
        my_history.history[0] = build_system_message(s.format(files=file_info))


        re = zhipuai.send_message_with_tools(build_human_message("两个文件都讲了什么，面临什么问题"))
        re = match_json_str(re)
        pprint.pprint(re)
        my_history.save()

    def test_thread_pool(self):
        def task(n):
            return n * n

        with ThreadPoolExecutor(max_workers=5) as executor:
            # 提交任务并保存Future对象
            futures = [executor.submit(task, i) for i in range(10)]

            # 等待所有任务完成并按完成顺序处理结果
            for future in as_completed(futures):
                result = future.result()  # 获取任务结果
                print(result)  # 打印结果

    def test_pdf_parse_time(self):
        project_root = '../'
        os.chdir(project_root)
        path = r""
        start_time = time.time()
        pdf_info, d = get_file_if_cached_otherwise_parse(path, file_name='从根儿上理解MySQL.pdf')
        end_time = time.time()
        total_time = end_time - start_time
        print("花费时间：", total_time)
        text = get_context_from_file(pdf_info, 18)
        print(text)

    def test_lll(self):
        arr = [1,2,3,4,5,6,7,8,9]
        p = 3
        deleted = []
        for i in range(p, len(arr)):
            print(i)
            deleted.append(arr[i])
        for i in deleted:
            arr.remove(i)
        print(arr)





if __name__ == '__main__':
    unittest.main()
